package ag;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.TreeSet;


public class main {
	public final static int numTestes = 1;
	
	public static void main(String[] args){
		// teste feito com 25 50 100 e 200
		// probMut 5%, 10% e 15%.
		final int numPop = 100;
		final int numInt = 20;
		final double probMut = 0.01;
		final double taxaCrossOver = 0.9;
		
		GeneticAlgorithm.avrgfValue = new double[numInt];
		GeneticAlgorithm.bestfValue = new double[numInt];
				
		ProblemaMochila pm = new ProblemaMochila();
		
		TreeSet alfabeto = new TreeSet();
		alfabeto.add('0');
		alfabeto.add('1');
		
		int contMelhorSolucao = 0;
		
		FitnessMochila fm = new FitnessMochila(pm);
		GeneticAlgorithm ag = new GeneticAlgorithm(14, alfabeto, probMut, taxaCrossOver, pm);
		long tempo = System.currentTimeMillis();  
		for (int i = 0; i< numTestes; i++){
			
			ArrayList<String> populacao = pm.geraPopulacao(numPop);
			String melhorSolucao = ag.geneticAlgorithm(populacao, fm, numInt);
			if(pm.calculaPesoIndividuo(melhorSolucao)==25 && pm.calculaValorIndividuo(melhorSolucao)== 35){
				contMelhorSolucao++;
			}
		}
		tempo = System.currentTimeMillis()-tempo;
		NumberFormat nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(3);
		System.out.println("Media dos melhores: ");
		for(int i = 0 ; i<numInt;i++){
			System.out.println(nf.format(GeneticAlgorithm.bestfValue[i]));
		}
		System.out.println("\nMedia da media: ");
		for(int i = 0 ; i<numInt;i++){
			System.out.println(nf.format(GeneticAlgorithm.avrgfValue[i]));
		}
		System.out.println("\nNumero total de testes: "+numTestes);
		System.out.println("\nAchou melhores globais em: "+contMelhorSolucao+ " testes");
		System.out.println("\nTempo medio " + tempo/numTestes);
		
		System.out.println("\ncontagens: " + fm.contfAcces);
	}
}